package tp.disenio.client;

import java.util.ArrayList;

import org.eclipse.persistence.internal.sessions.remote.SequencingFunctionCall.GetNextValue;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.PushButton;
import tp.disenio.client.ResultadoDTO;
import tp.disenio.client.CompetenciaDTO;



public class FixtureUA extends Composite {
	
	private Button btnHome;
	private Button btnResultadosBsqueda;
	private Button btnPrimerFecha;
	private Button btnAnteriorFecha;
	private Button btnSiguienteFecha;
	private Button btnUltimaFecha;
	private FlexTable flexTable;
	private PushButton pshbtnModificar;
	private PushButton pshbtnDarDeBaja;
	private PushButton pshbtnFixture;
	private PushButton pshbtnParticipantes;
	private PushButton pshbtnTablaDePosiciones;
	private PushButton pshbtnGenerarFixture;
	private TextBox txtBxNombre;
	private TextBox txtBxModalidad;
	private TextBox txtBxDeporte;
	private TextBox txtBxEstadodecompetencia;
	private Label lblUsuario;
	private Label lblSalir;
	private Label lblNumeroFecha;
	private Label lblCantidadFechas;
	private Label lblFechaCompuesta;
	private CompetenciaDTO competencia;
	private ArrayList<ResultadoDTO> listadoFecha = new ArrayList<ResultadoDTO>();
	private ArrayList<String> listadoBotonResultado = new ArrayList<String>();
	private final RootPanel rootPanel;



	public FixtureUA(String user,CompetenciaDTO competencia,int fechaNumero) {
		
		rootPanel = RootPanel.get("nameFieldContainer");
		
		AbsolutePanel absolutePanel = new AbsolutePanel();
		initWidget(absolutePanel);
		absolutePanel.setSize("1024px", "576px");
		
		setCompetencia(competencia);
		
		
		
		// WIDGETS 
				
		btnHome = new Button("Home");
		absolutePanel.add(btnHome, 100, 100);
		
		btnResultadosBsqueda = new Button("Volver a B\u00FAsqueda");
		absolutePanel.add(btnResultadosBsqueda, 160, 100);
	
		btnPrimerFecha = new Button("<<");
		absolutePanel.add(btnPrimerFecha,290,245);
		
		btnAnteriorFecha = new Button("<");
		absolutePanel.add(btnAnteriorFecha,340,245);
		
		btnSiguienteFecha = new Button(">");
		absolutePanel.add(btnSiguienteFecha,380,245);
		
		btnUltimaFecha = new Button(">>");
		absolutePanel.add(btnUltimaFecha,420,245);
				
		pshbtnModificar = new PushButton("Modificar");
		absolutePanel.add(pshbtnModificar, 759, 195);
		pshbtnModificar.setSize("131px", "18px");
		
		pshbtnDarDeBaja = new PushButton("Dar de Baja");
		absolutePanel.add(pshbtnDarDeBaja, 759, 225);
		pshbtnDarDeBaja.setSize("131px", "18px");
		
		pshbtnFixture = new PushButton("Fixture");
		absolutePanel.add(pshbtnFixture, 759, 255);
		pshbtnFixture.setSize("131px", "18px");
		
		pshbtnParticipantes = new PushButton("Participantes");
		absolutePanel.add(pshbtnParticipantes, 759, 285);
		pshbtnParticipantes.setSize("131px", "18px");
		
		pshbtnTablaDePosiciones = new PushButton("Tabla de Posiciones");
		absolutePanel.add(pshbtnTablaDePosiciones, 759, 315);
		pshbtnTablaDePosiciones.setSize("131px", "18px");
		
		pshbtnGenerarFixture = new PushButton("Generar Fixture");
		absolutePanel.add(pshbtnGenerarFixture, 759, 345);
		pshbtnGenerarFixture.setSize("131px", "18px");
		
		txtBxNombre = new TextBox();
		absolutePanel.add(txtBxNombre, 150, 210);
		txtBxNombre.setSize("135px", "15px");
		
		txtBxModalidad = new TextBox();
		absolutePanel.add(txtBxModalidad, 300, 210);
		txtBxModalidad.setSize("135px", "15px");
		
		txtBxDeporte = new TextBox();
		absolutePanel.add(txtBxDeporte, 450, 210);
		txtBxDeporte.setSize("135px", "15px");
		
		txtBxEstadodecompetencia = new TextBox();
		absolutePanel.add(txtBxEstadodecompetencia, 600, 210);
		txtBxEstadodecompetencia.setSize("135px", "15px");
		
		ScrollPanel scrollPanelCompetencias = new ScrollPanel();
		absolutePanel.add(scrollPanelCompetencias, 205, 280);
		scrollPanelCompetencias.setSize("520px", "180px");
		
		flexTable = new FlexTable();
		scrollPanelCompetencias.setWidget(flexTable);
		flexTable.setSize("100%", "100%");
		
		
		
		// LABELS 
		
		Label lblFecha = new Label("Fecha");
		lblFecha.setStyleName("expresionLabel");
		absolutePanel.add(lblFecha,500,250);
		
		lblNumeroFecha = new Label("1");
		lblCantidadFechas = new Label("20");
		
		lblFechaCompuesta = new Label();
		lblFechaCompuesta.setStyleName("expresionLabel");
		cargarNumeroFecha();
		absolutePanel.add(lblFechaCompuesta,555,250);
				
		lblUsuario = new Label("");
		lblUsuario.setText(user);
		lblUsuario.setStyleName("usuarioLabel");
		absolutePanel.add(lblUsuario, 820, 95);
		
		lblSalir = new Label("Salir");
		lblSalir.setStyleName("usuarioLabel");
		absolutePanel.add(lblSalir, 780, 95);
		
		Label lblInformacionDeLa = new Label("INFORMACION DE LA COMPETENCIA");
		lblInformacionDeLa.setStyleName("subTituloInformacionCompetencia");
		absolutePanel.add(lblInformacionDeLa, 275, 140);
		
		lblInformacionDeLa.addClickHandler(new ClickHandler() {
			
			@Override
			public void onClick(ClickEvent event) {
								
//				setVisibilidad(false);
				rootPanel.remove(rootPanel.getWidget(1));
				rootPanel.add(new VerCompetenciaUA(getLblUsuario().getText(),getCompetenciaDTO()),100,50);
				
			}
		});

		Label lblNombre = new Label("Nombre ");
		lblNombre.setStyleName("label");
		absolutePanel.add(lblNombre, 200, 190);
		
		Label lblModalidad = new Label("Modalidad");
		lblModalidad.setStyleName("label");
		absolutePanel.add(lblModalidad, 340, 190);
		lblModalidad.setSize("45px", "18px");
		
		Label lblDeporte = new Label("Deporte");
		lblDeporte.setStyleName("label");
		absolutePanel.add(lblDeporte, 500, 190);
		lblDeporte.setSize("45px", "18px");
		
		Label lblEstadodecompetencia = new Label("Estado");
		lblEstadodecompetencia.setStyleName("label");
		absolutePanel.add(lblEstadodecompetencia, 650, 190);
		
		
		
		// INICIANDO
		
			
		    cargarDatosCompetencia();
			getLblNumeroFecha().setText(fechaNumero+"");
			CargarFixture();
			
		
		
		//HANDLERS
			
		getLblUsuario().addClickHandler(new ClickHandler() {
			
			@Override
			public void onClick(ClickEvent event) {
			
				Window.alert("Modficar Datos Usuario ");
				
			}
		});
		
		
		getLblSalir().addClickHandler(new ClickHandler() {
			
			@Override
			public void onClick(ClickEvent event) {
				
//				setVisibilidad(false);
				rootPanel.remove(rootPanel.getWidget(1));
				rootPanel.add(new Ingreso(),(Window.getClientWidth()/3),150);
				Window.alert("Usted se ha deslogeado");
				
			}
		});
		 getBtnHome().addClickHandler(new ClickHandler() {
				
				@Override
				public void onClick(ClickEvent event) {
				
//					setVisibilidad(false);
					rootPanel.remove(rootPanel.getWidget(1));
					rootPanel.add(new HomeUA(getLblUsuario().getText()),100,50);
				   
				}
			});
		 
		 getBtnResultadosBsqueda().addClickHandler(new ClickHandler() {
			
			@Override
			public void onClick(ClickEvent event) {
			
//				setVisibilidad(false);
				rootPanel.remove(rootPanel.getWidget(1));
				rootPanel.add(new ListarCompetenciasDeportivasUA(getLblUsuario().getText()),100,45);

				
			}
		});
		
		 
		getPshbtnParticipantes().addClickHandler(new ClickHandler() {
			
			@Override
			public void onClick(ClickEvent event) {
				
				
//				setVisibilidad(false);
				rootPanel.remove(rootPanel.getWidget(1));
				rootPanel.add(new ListarParticipantes(getLblUsuario().getText(),getCompetenciaDTO()),100,50);
				
				
				
			}
		});
		 
		
		getPshbtnTablaDePosiciones().addClickHandler(new ClickHandler(
				) {
			
			@Override
			public void onClick(ClickEvent event) {
				
//				setVisibilidad(false);
				rootPanel.remove(rootPanel.getWidget(1));
				rootPanel.add(new TablaDePosicionesUA(getLblUsuario().getText(),getCompetenciaDTO()),100,50);
				
			}
		});
		
		
		getPshbtnGenerarFixture().addClickHandler(new ClickHandler() {
			
			final GenerarFixtureServiceAsync generarFixture = GWT.create(GenerarFixtureService.class);
			
			@Override
			public void onClick(ClickEvent event) {
				 
				AsyncCallback<String> callback = new AsyncCallback<String>() {
					 
				     public void onFailure(Throwable caught) {
				      // do some UI stuff to show failure
				    	 Window.alert(caught.getMessage());
				    }

					@Override
					public void onSuccess(String result) {
						// TODO Auto-generated method stub
				
						Window.alert((String)result);
					
					}
				  };
				  
				  generarFixture.generarFixture(getCompetenciaDTO(), callback);
		
			}
		});
		
		
		
		getBtnPrimerFecha().addClickHandler(new ClickHandler() {
			
			@Override
			public void onClick(ClickEvent event) {
				// TODO Auto-generated method stub
				
				getLblNumeroFecha().setText(1+"");
				cargarNumeroFecha();
				CargarFixture();
			}
		});


		getBtnAnteriorFecha().addClickHandler(new ClickHandler() {
			
			@Override
			public void onClick(ClickEvent event) {
				// TODO Auto-generated method stub
				
				int numeroFecha = Integer.parseInt(getLblNumeroFecha().getText());
				if(numeroFecha>1){
					
					getLblNumeroFecha().setText((numeroFecha-1)+"");
					cargarNumeroFecha();
					CargarFixture();
				}
				
		
				
			}
		});
		
		getBtnSiguienteFecha().addClickHandler(new ClickHandler() {
			
			@Override
			public void onClick(ClickEvent event) {
				// TODO Auto-generated method stub
				
				int numeroFecha = Integer.parseInt(getLblNumeroFecha().getText());
				int ultimaFecha = Integer.parseInt(getLblCantidadFechas().getText());
				if(numeroFecha<ultimaFecha){
					
					getLblNumeroFecha().setText((numeroFecha+1)+"");
					cargarNumeroFecha();
					CargarFixture();
				}
				
				
			}
		});
		 
		getBtnUltimaFecha().addClickHandler(new ClickHandler() {
			
			@Override
			public void onClick(ClickEvent event) {
				// TODO Auto-generated method stub
				
				int ultimaFecha = Integer.parseInt(getLblCantidadFechas().getText());
								
					getLblNumeroFecha().setText((ultimaFecha)+"");
					cargarNumeroFecha();
					
					CargarFixture();
								
				
			}
		});

		
		
		
		
	}
	
     
	public void cargarDatosCompetencia(){
		
		getTxtBxNombre().setText(getCompetenciaDTO().getNombre());getTxtBxNombre().setReadOnly(true);
		getTxtBxModalidad().setText(getCompetenciaDTO().getModalidad());getTxtBxModalidad().setReadOnly(true);
		getTxtBxDeporte().setText(getCompetenciaDTO().getDeporte());getTxtBxDeporte().setReadOnly(true);
		getTxtBxEstadodecompetencia().setText(getCompetenciaDTO().getEstadodecompetencia());getTxtBxEstadodecompetencia().setReadOnly(true);
		
	}
	
	
	public void CargarFixture(){
		
		final VerFixtureServiceAsync verFixture = GWT.create(VerFixtureService.class);
		
		 AsyncCallback<Integer> callback2 = new AsyncCallback<Integer>() {
			 
			 @Override
		     public void onFailure(Throwable caught) {
		      // do some UI stuff to show failure
		    	 Window.alert(caught.getMessage());
		    }

			@Override
			public void onSuccess(Integer result) {
				// TODO Auto-generated method stub
		
				getLblCantidadFechas().setText(result+"");
				cargarNumeroFecha();
				
				
				
			}
		  };
		  
		 verFixture.getCantidadDeFechas(getCompetenciaDTO(), callback2);
		 
			AsyncCallback<ArrayList<ResultadoDTO>> callback = new AsyncCallback<ArrayList<ResultadoDTO>>() {
				 
				@Override
			     public void onFailure(Throwable caught) {
			      // do some UI stuff to show failure
			    	 Window.alert(caught.getMessage());
			    }

				@Override
				public void onSuccess(ArrayList<ResultadoDTO> result) {
					// TODO Auto-generated method stub
			
					getListadoFecha().clear();
					setListadoFecha(result);
					cargarFecha();
				}
			  };
			 
			  verFixture.getFecha(getCompetenciaDTO(),Integer.parseInt(getLblNumeroFecha().getText())-1, callback);
			 
			 
			
			
		
	}

	
	public void cargarFecha(){
		
			for(int i=0;i<getListadoFecha().size();i++){
				
				Label vs = new Label("VS");
			
				flexTable.getRowFormatter().setStyleName(i, "FlexTable");
				flexTable.setText(i, 0,getListadoFecha().get(i).getNombreLocal());
				flexTable.setText(i, 1,getListadoFecha().get(i).getResultadoLocal());
				flexTable.setWidget(i, 2,vs);
				flexTable.setText(i, 3,getListadoFecha().get(i).getResultadoVisitante());							
				flexTable.setText(i, 4,getListadoFecha().get(i).getNombreVisitante());
				
				final String symbol = i+"1";
				getListadoBotonResultado().add(symbol);
				
				final String index = i+"";
				
				Button btnResultado = new Button("Resultado");
				flexTable.setWidget(i,5,btnResultado);
				
				vs.addClickHandler(new ClickHandler() {
					
					@Override
					public void onClick(ClickEvent event) {
						// TODO Auto-generated method stub
						
						Window.alert(getListadoFecha().get(Integer.parseInt(index)).getLugarHorario());
						
					}
				});
				
				
				btnResultado.addClickHandler(new ClickHandler() {
					
					@Override
					public void onClick(ClickEvent event) {
						// TODO Auto-generated method stub
						
//						setVisibilidad(false);
						rootPanel.remove(rootPanel.getWidget(1));
						    
						int fila = getListadoBotonResultado().indexOf(symbol);
						getListadoBotonResultado().remove(symbol);
						
						getRootPanel().add(new GestionarResultado(getLblUsuario().getText(), getCompetenciaDTO(), getListadoFecha().get(fila),Integer.parseInt(getLblNumeroFecha().getText())),100,50);
						
					}
				});
				
				
				
				
			}
	
	}
	
	
	/**
	 * @return the txtBxNombre
	 */
	public TextBox getTxtBxNombre() {
		return txtBxNombre;
	}


	/**
	 * @param txtBxNombre the txtBxNombre to set
	 */
	public void setTxtBxNombre(TextBox txtBxNombre) {
		this.txtBxNombre = txtBxNombre;
	}


	/**
	 * @return the txtBxModalidad
	 */
	public TextBox getTxtBxModalidad() {
		return txtBxModalidad;
	}


	/**
	 * @param txtBxModalidad the txtBxModalidad to set
	 */
	public void setTxtBxModalidad(TextBox txtBxModalidad) {
		this.txtBxModalidad = txtBxModalidad;
	}


	/**
	 * @return the txtBxDeporte
	 */
	public TextBox getTxtBxDeporte() {
		return txtBxDeporte;
	}


	/**
	 * @param txtBxDeporte the txtBxDeporte to set
	 */
	public void setTxtBxDeporte(TextBox txtBxDeporte) {
		this.txtBxDeporte = txtBxDeporte;
	}


	/**
	 * @return the txtBxEstadodecompetencia
	 */
	public TextBox getTxtBxEstadodecompetencia() {
		return txtBxEstadodecompetencia;
	}


	/**
	 * @param txtBxEstadodecompetencia the txtBxEstadodecompetencia to set
	 */
	public void setTxtBxEstadodecompetencia(TextBox txtBxEstadodecompetencia) {
		this.txtBxEstadodecompetencia = txtBxEstadodecompetencia;
	}


	/**
	 * @return the lblUsuario
	 */
	public Label getLblUsuario() {
		return lblUsuario;
	}


	/**
	 * @param lblUsuario the lblUsuario to set
	 */
	public void setLblUsuario(Label lblUsuario) {
		this.lblUsuario = lblUsuario;
	}


	/**
	 * @return the btnHome
	 */
	public Button getBtnHome() {
		return btnHome;
	}


	/**
	 * @return the btnResultadosBsqueda
	 */
	public Button getBtnResultadosBsqueda() {
		return btnResultadosBsqueda;
	}




	/**
	 * @return the flexTable
	 */
	public FlexTable getFlexTable() {
		return flexTable;
	}


	/**
	 * @return the pshbtnModificar
	 */
	public PushButton getPshbtnModificar() {
		return pshbtnModificar;
	}


	/**
	 * @return the pshbtnDarDeBaja
	 */
	public PushButton getPshbtnDarDeBaja() {
		return pshbtnDarDeBaja;
	}


	/**
	 * @return the pshbtnFixture
	 */
	public PushButton getPshbtnFixture() {
		return pshbtnFixture;
	}


	/**
	 * @return the pshbtnParticipantes
	 */
	public PushButton getPshbtnParticipantes() {
		return pshbtnParticipantes;
	}


	/**
	 * @return the pshbtnTablaDePosiciones
	 */
	public PushButton getPshbtnTablaDePosiciones() {
		return pshbtnTablaDePosiciones;
	}


	/**
	 * @return the pshbtnGenerarFixture
	 */
	public PushButton getPshbtnGenerarFixture() {
		return pshbtnGenerarFixture;
	}


	/**
	 * @return the lblSalir
	 */
	public Label getLblSalir() {
		return lblSalir;
	}

	/**
	 * @return the lblNumeroFecha
	 */
	public Label getLblNumeroFecha() {
		return lblNumeroFecha;
	}


	/**
	 * @return the lblCantidadFechas
	 */
	public Label getLblCantidadFechas() {
		return lblCantidadFechas;
	}


	
	public void cargarNumeroFecha(){
		
		getLblFechaCompuesta().setText(getLblNumeroFecha().getText()+" de "+getLblCantidadFechas().getText());
		
		
	}
	

	/**
	 * @return the lblFechaCompuesta
	 */
	public Label getLblFechaCompuesta() {
		return lblFechaCompuesta;
	}
	
	/**
	 * @return the btnPrimerFecha
	 */
	public Button getBtnPrimerFecha() {
		return btnPrimerFecha;
	}


	/**
	 * @return the btnAnteriorFecha
	 */
	public Button getBtnAnteriorFecha() {
		return btnAnteriorFecha;
	}


	/**
	 * @return the btnSiguienteFecha
	 */
	public Button getBtnSiguienteFecha() {
		return btnSiguienteFecha;
	}


	/**
	 * @return the btnUltimaFecha
	 */
	public Button getBtnUltimaFecha() {
		return btnUltimaFecha;
	}
	


	/**
	 * @return the competencia
	 */
	public CompetenciaDTO getCompetenciaDTO() {
		return competencia;
	}


	/**
	 * @param competencia the competencia to set
	 */
	public void setCompetencia(CompetenciaDTO competencia) {
		this.competencia = competencia;
	}
	

	
	/**
	 * @param lblNumeroFecha the lblNumeroFecha to set
	 */
	public void setLblNumeroFecha(Label lblNumeroFecha) {
		this.lblNumeroFecha = lblNumeroFecha;
	}


	/**
	 * @param lblCantidadFechas the lblCantidadFechas to set
	 */
	public void setLblCantidadFechas(Label lblCantidadFechas) {
		this.lblCantidadFechas = lblCantidadFechas;
	}


	public void setVisibilidad(boolean estado){
		this.setVisible(estado);
	}
	


	/**
	 * @return the listadoFecha
	 */
	public ArrayList<ResultadoDTO> getListadoFecha() {
		return listadoFecha;
	}



	/**
	 * @return the listadoBotonResultado
	 */
	public ArrayList<String> getListadoBotonResultado() {
		return listadoBotonResultado;
	}
	


	/**
	 * @return the rootPanel
	 */
	public RootPanel getRootPanel() {
		return rootPanel;
	}

	/**
	 * @param listadoFecha the listadoFecha to set
	 */
	public void setListadoFecha(ArrayList<ResultadoDTO> listadoFecha) {
		this.listadoFecha = listadoFecha;
	}
}
